/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.cip.esymons.colegiatura.beans;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.cip.esymons.colegiatura.bc.ColegiadoDelegate;
import org.cip.esymons.colegiatura.bc.ColegiadoImagenDelegate;
import org.cip.esymons.colegiatura.bc.DerechosAutorDelegate;
import org.cip.esymons.colegiatura.bc.FormacionProfesionalDelegate;
import org.cip.esymons.colegiatura.bc.UniversidadDelegate;
import org.cip.esymons.colegiatura.bc.solicitanteDelegate;
import org.cip.esymons.colegiatura.be.Colegiado;
import org.cip.esymons.colegiatura.be.ColegiadoImagen;
import org.cip.esymons.colegiatura.be.DerechosAutor;
import org.cip.esymons.colegiatura.be.FormacionProfesional;
import org.cip.esymons.general.be.PersonaNatural;
import org.cip.esymons.general.be.Universidad;

/**
 *
 * @author WILLIAM GASTAÑUEDI CABALLERO
 */
public class derechosAutorController {
//DECLARACION DE CLASES
    private ColegiadoDelegate delegadoColegiado;
    private DerechosAutorDelegate delegadoDerechos;
    private ColegiadoImagenDelegate delegadoColImagen;
    private solicitanteDelegate delegadoSolicitante;
    private FormacionProfesionalDelegate delegadoFormacion;
    private UniversidadDelegate delegadoUniversidad;

    private Colegiado colegiado;
    private DerechosAutor derechosAutor;
    private PersonaNatural persona;
    private FormacionProfesional formacion;
    private Universidad universidad;
    
    List<PersonaNatural> listaPersonasFotos = new ArrayList<PersonaNatural>();
    List<PersonaNatural> listaPersonas = new ArrayList<PersonaNatural>();

    private String codigoCIP;
    private String dni,apePat,apeMat,nombre,ruc;
    private Boolean soloColegiados;
    private Boolean panelActivo;
//CONSTRUCTOR
    public derechosAutorController() {

        delegadoColegiado = new ColegiadoDelegate();
        delegadoDerechos = new DerechosAutorDelegate();
        delegadoColImagen = new ColegiadoImagenDelegate();
        delegadoSolicitante = new solicitanteDelegate();
        delegadoFormacion = new FormacionProfesionalDelegate();
        delegadoUniversidad = new UniversidadDelegate();

        colegiado = new Colegiado();
        derechosAutor = new DerechosAutor();
        persona = new PersonaNatural();
        formacion = new FormacionProfesional();
        universidad = new Universidad();

        listaPersonasFotos = new ArrayList<PersonaNatural>();
        listaPersonas = new ArrayList<PersonaNatural>();

        codigoCIP = "";
        dni = "";
        apePat = "";
        apeMat = "";
        nombre = "";
        ruc = "";
        soloColegiados = false;
        panelActivo = false;

    }
//GETTERS AND SETTERS
    public Boolean getPanelActivo() {
        return panelActivo;
    }

    public void setPanelActivo(Boolean panelActivo) {
        this.panelActivo = panelActivo;
    }

    public UniversidadDelegate getDelegadoUniversidad() {
        return delegadoUniversidad;
    }

    public void setDelegadoUniversidad(UniversidadDelegate delegadoUniversidad) {
        this.delegadoUniversidad = delegadoUniversidad;
    }

    public Universidad getUniversidad() {
        return universidad;
    }

    public void setUniversidad(Universidad universidad) {
        this.universidad = universidad;
    }

    public FormacionProfesional getFormacion() {
        return formacion;
    }

    public void setFormacion(FormacionProfesional formacion) {
        this.formacion = formacion;
    }

    public FormacionProfesionalDelegate getDelegadoFormacion() {
        return delegadoFormacion;
    }

    public void setDelegadoFormacion(FormacionProfesionalDelegate delegadoFormacion) {
        this.delegadoFormacion = delegadoFormacion;
    }

    public String getApeMat() {
        return apeMat;
    }

    public void setApeMat(String apeMat) {
        this.apeMat = apeMat;
    }

    public String getApePat() {
        return apePat;
    }

    public void setApePat(String apePat) {
        this.apePat = apePat;
    }

    public String getCodigoCIP() {
        return codigoCIP;
    }

    public void setCodigoCIP(String codigoCIP) {
        this.codigoCIP = codigoCIP;
    }

    public Colegiado getColegiado() {
        return colegiado;
    }

    public void setColegiado(Colegiado colegiado) {
        this.colegiado = colegiado;
    }

    public ColegiadoImagenDelegate getDelegadoColImagen() {
        return delegadoColImagen;
    }

    public void setDelegadoColImagen(ColegiadoImagenDelegate delegadoColImagen) {
        this.delegadoColImagen = delegadoColImagen;
    }

    public ColegiadoDelegate getDelegadoColegiado() {
        return delegadoColegiado;
    }

    public void setDelegadoColegiado(ColegiadoDelegate delegadoColegiado) {
        this.delegadoColegiado = delegadoColegiado;
    }

    public DerechosAutorDelegate getDelegadoDerechos() {
        return delegadoDerechos;
    }

    public void setDelegadoDerechos(DerechosAutorDelegate delegadoDerechos) {
        this.delegadoDerechos = delegadoDerechos;
    }

    public solicitanteDelegate getDelegadoSolicitante() {
        return delegadoSolicitante;
    }

    public void setDelegadoSolicitante(solicitanteDelegate delegadoSolicitante) {
        this.delegadoSolicitante = delegadoSolicitante;
    }

    public DerechosAutor getDerechosAutor() {
        return derechosAutor;
    }

    public void setDerechosAutor(DerechosAutor derechosAutor) {
        this.derechosAutor = derechosAutor;
    }

    public String getDni() {
        return dni;
    }

    public void setDni(String dni) {
        this.dni = dni;
    }

    public List<PersonaNatural> getListaPersonas() {
        return listaPersonas;
    }

    public void setListaPersonas(List<PersonaNatural> listaPersonas) {
        this.listaPersonas = listaPersonas;
    }

    public List<PersonaNatural> getListaPersonasFotos() {
        return listaPersonasFotos;
    }

    public void setListaPersonasFotos(List<PersonaNatural> listaPersonasFotos) {
        this.listaPersonasFotos = listaPersonasFotos;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public PersonaNatural getPersona() {
        return persona;
    }

    public void setPersona(PersonaNatural persona) {
        this.persona = persona;
    }

    public String getRuc() {
        return ruc;
    }

    public void setRuc(String ruc) {
        this.ruc = ruc;
    }

    public Boolean getSoloColegiados() {
        return soloColegiados;
    }

    public void setSoloColegiados(Boolean soloColegiados) {
        this.soloColegiados = soloColegiados;
    }

    //ACTUALIZAR LA HABILIDAD DEL COLEGIADO
    public String verHabilidad(){

        try{
        String MesActual, MesHabil, yearActual,yearHabil;
        Integer MA,MH,YA,YH;
        MesActual="";  MesHabil=""; yearActual=""; yearHabil="";
        MA = null; MH=null; YA=null; YH=null;

        SimpleDateFormat ma = new SimpleDateFormat("MM");
        MesActual = ma.format(new Date());
        SimpleDateFormat ya = new SimpleDateFormat("yyyy");
        yearActual = ya.format(new Date());

        SimpleDateFormat mh = new SimpleDateFormat("MM");
        MesHabil = mh.format(colegiado.getColfechaHabilidad());
        SimpleDateFormat yh = new SimpleDateFormat("yyyy");
        yearHabil = yh.format(colegiado.getColfechaHabilidad());

        MA = Integer.parseInt(MesActual);
        YA = Integer.parseInt(yearActual);
        MH = Integer.parseInt(MesHabil);
        YH = Integer.parseInt(yearHabil);

        if(YA>YH){
            colegiado.setColCondicion(false);
            delegadoColegiado.edit(colegiado);
        }else{
            if(MA>MH){
                colegiado.setColCondicion(false);
                delegadoColegiado.edit(colegiado);
            }else{
                colegiado.setColCondicion(true);
                delegadoColegiado.edit(colegiado);
            }
        }
        return null;
        }catch(Exception ex){
            return null;
        }
    }

    //BUSCAMOS EL COLEGIADO POR CIP
    public String buscaPorCip(){
       try {

        colegiado = new Colegiado();
        derechosAutor = new DerechosAutor();
        formacion = new FormacionProfesional();
        String envia = null;
        Integer cifras = codigoCIP.length();
             if(cifras<3){
                 codigoCIP = "0000"+ codigoCIP;
             }else{
                   if(cifras<4){
                       codigoCIP = "000"+codigoCIP;
                   }else{
                       if(cifras<5){
                           codigoCIP = "00"+codigoCIP;
                       }else{
                           if(cifras<6){
                              codigoCIP = "0"+codigoCIP;
                           }
                       }
                   }
             }

            colegiado = delegadoColegiado.buscaPorCip(codigoCIP);
            if(colegiado != null){
                verHabilidad();
                colegiado = new Colegiado();
                colegiado = delegadoColegiado.buscaPorCip(codigoCIP);
                formacion = delegadoFormacion.buscaTitulo(colegiado.getSolCodigo());
                universidad = delegadoUniversidad.buscaUniversidad(formacion.getUniCodigo().getUniCodigo());
                derechosAutor = delegadoDerechos.buscaDerechosAutorColegiado(colegiado.getSolCodigo());
                if(derechosAutor == null){
                    derechosAutor = new DerechosAutor();
                    envia = "verFicha";
                }else{
                    mostrarMensaje("INFO: ", "La persona ya tiene registrada su ficha de cesión digital...", FacesMessage.SEVERITY_INFO);
                    envia = "buscarColegiado";
                }
                codigoCIP = "";
                return envia;
            }else{
                codigoCIP = "";
                return null;
            }        

        } catch (Exception e) {
            return null;
        }
    }


    //BUSCAMOS UN COLEGIADO POR NOMBRES, APELLIDO PATERNO, APELLIDO MATERNO

    public String buscarColegiado(){

        try{
            ruc = "";
            soloColegiados = false;
            ColegiadoImagen foto = new ColegiadoImagen();

            listaPersonasFotos = new ArrayList<PersonaNatural>();
            listaPersonas = new ArrayList<PersonaNatural>();
            listaPersonas = delegadoSolicitante.buscarPerNatural(dni, apePat, apeMat, nombre, ruc, soloColegiados);

            for(PersonaNatural per : listaPersonas ){

                Long codigoPer = per.getSolCodigo();
                foto = delegadoColImagen.buscaFoto(codigoPer);
                if(foto != null) {
                   per.setFoto(foto);
                }
                listaPersonasFotos.add(per);
            }
            dni = "";
            apePat = "";
            apeMat ="";
            nombre = "";
            panelActivo = true;

        }catch(Exception ex){
            return null;
        }
      return null;
    }

  //SELECCIONAMOS EL COLEGIADO DE LA LISTA DE BUSQUEDA
    public String generarFicha(){

        try {

            String envia = null;
            colegiado = new Colegiado();
            colegiado = delegadoColegiado.buscaColegiado(persona.getSolCodigo());//buscaPorDni(persona.getPerNroDNI());
            verHabilidad();
            colegiado = new Colegiado();
            derechosAutor = new DerechosAutor();
            colegiado = delegadoColegiado.buscaColegiado(persona.getSolCodigo());

            formacion = delegadoFormacion.buscaTitulo(colegiado.getSolCodigo());
            universidad = delegadoUniversidad.buscaUniversidad(formacion.getUniCodigo().getUniCodigo());
            envia = "verFicha";

            codigoCIP = "";
            listaPersonasFotos.clear(); // ultimo cambio
            panelActivo = false;
            return envia;

        } catch (Exception ex) {
            return null;
        }
    }
//GRABAMOS SU FICHA DE CESION DE DERECHOS DE AUTOR
    public String grabaNuevaFicha(){

        try {
            derechosAutor.setColCodigo(colegiado);
            derechosAutor.setEspCodigo(formacion.getEspCodigo());
            derechosAutor.setCdafechaRegistro(new Date());
            delegadoDerechos.create(derechosAutor);
            inicializa();
            
            mostrarMensaje("INFO: ", "Registro satisfactorio...", FacesMessage.SEVERITY_INFO);
        } catch (Exception ex) {
          mostrarMensaje("INFO: ", "Error al registra ficha de cesión digital...", FacesMessage.SEVERITY_INFO);
        }
        return "buscarColegiado";
    }
//METODO QUE PERMITE CARGAR LA FOTO DE LOS COLEGIADOS QUE SE MUESTRAN EN LA LISTA DE BUSQUEDA.
    public void drawImagenListaFotos(OutputStream output, Object object) throws IOException{

        PersonaNatural person = new PersonaNatural();

        try {
             Integer index = new Integer(object.toString());
             person = listaPersonasFotos.get(index);
             File file = new File(person.getFoto().getCimRuta());
             FileInputStream inputStream = new FileInputStream(file);
             int tamañoInput = inputStream.available();
             byte[] datos = new byte[tamañoInput];
             inputStream.read(datos, 0, tamañoInput);
             output.write(datos, 0, tamañoInput);

        } catch (Exception e) {

        }
    }
//METODO QUE ANULA EL PROCESO DE REGISTRO U OTRO.
    public String cancelar(){

        inicializa();
        return "buscarColegiado";
    }
//METODO QUE INICIALIZA LAS CLASES.
    public String inicializa(){

        delegadoColegiado = new ColegiadoDelegate();
        delegadoDerechos = new DerechosAutorDelegate();
        delegadoColImagen = new ColegiadoImagenDelegate();
        delegadoSolicitante = new solicitanteDelegate();
        delegadoFormacion = new FormacionProfesionalDelegate();
        delegadoUniversidad = new UniversidadDelegate();

        colegiado = new Colegiado();
        derechosAutor = new DerechosAutor();
        persona = new PersonaNatural();
        formacion = new FormacionProfesional();
        universidad = new Universidad();

        listaPersonasFotos = new ArrayList<PersonaNatural>();
        listaPersonas = new ArrayList<PersonaNatural>();

        codigoCIP = "";
        dni = "";
        apePat = "";
        apeMat = "";
        nombre = "";
        ruc = "";
        soloColegiados = false;
        panelActivo = false;

        return null;
    }
//METODO QUE DEVUELVE LA FECHA ACTUAL EN FORMATO CADENA.
    public String getFechaActual(){
        String day,m,anno,fecha = null;
        SimpleDateFormat dia = new SimpleDateFormat("dd");
        SimpleDateFormat mes = new SimpleDateFormat("MMMM");
        SimpleDateFormat year = new SimpleDateFormat("yyyy");
        day = dia.format(new Date());
        m = mes.format(new Date());
        anno = year.format(new Date());
        fecha = day+" de "+m+" de "+anno;
        return fecha;
    }
//METODO QUE MUESTRA LOS MENSAJES DE EXITO O ERROR.
    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }
}
